package com.zisu.rabbitproducer.component;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2021/5/11 19:16
 */

@Component
public class ConfirmBackSender implements RabbitTemplate.ConfirmCallback {

    /**
     * rabbitTemplate.setConfirmCallback() 会调用这个接口。
     * 确认消息 的回调监听接口，，用于确认消息是否被broker所收到(也就是 是否投递到exchange（不能保证是否投递到queue）)。
     * 当消息被broker 成功接收到 后 会调用这个方法
     * */
    /**
     * 参数：
     *      CorrelationData  作为一个唯一标识（ 生产者 消费者 消息确认的唯一标识 ）
     *      b                broker是否落盘成功
     *      s                失败的一些异常信息会送
     * */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        //如果RabbitMQ 因为自身内部错
        //误导致消息丢失，就会发送一条nack (Basic . Nack ）命令，生产者应用程序同样可以在回调
        //方法中处理该nack 命令。
        if (ack) {
            System.out.println("消息[" + correlationData.getId() + "]成功发送到指定ExChange");
        } else {
            System.out.println("消息[" + correlationData.getId() + "]发送到ExChange失败:" + cause);
        }
    }
}
